iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
AI & Data

Machine Learning系列 第 24

Day24 - Feature Engineering -- 10. Feature Creation

  • 分享至 

  • xImage
  •  

10. Feature Creation

Feature creation 是由現有的特徵建立新的特徵。新的特徵可經由演算法自動產生,或運用資料的領域常識,經由數學運算產生。

Feature creation更常出現在自然語言處理上,例如為文章(Text)建立bag of words或字元頻率表。

Interaction Features
檢視整個資料集,了解變數的領域知識,建立新特徵。
兩個特徵相加:如果我們的銷售資料,有藍筆和黑筆的個別資料,我們需要把他加總,如果我們只在意筆的總銷售量。

df['sales_pens'] = df['sales_blue_pens'].add(df['sales_black_pens'])

兩個特徵相減:例如我們有房子建築的日期和房子購買的日期,我們可以將其相減獲得銷售時的屋齡。

df['house_age_at_purchase'] = df['house_purchase_date'].sub(df['house_built_date'])

兩個特徵相乘:將銷售產品的單價,乘上銷售數量取的銷售額特徵。

df['sales'] = df['quantity'].prod(df['Unit price'])

兩個特徵相除:有一些變數經過相除獲會對我們更有意義 例如:債務收入比率,我們可以將總負債除以總收入。

df['debt-to-income ratio'] = df['total debt'].prod(df['total income'])

Polynomial expansion多項式擴張
一個變數和自己結合,也就是變數的多項式結合。變數的多項式結合可以傳達更多的訊息,也能獲得特徵之間的關聯,對線性學習來說較好。

使用scikit-learn:

from sklearn.preprocessing import PolynomialFeatures
#2個特徵*X*和*Y*,3列
X = np.arange(6).reshape(3, 2)
X

array([[0, 1],
[2, 3],
[4, 5]])

多項式擴充,原來只有XY變數,現在增加了XXYYXYbias

poly = PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)
poly.fit_transform(X)

array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])

應用在boston_dataset上:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures

boston_dataset = load_boston()
data = pd.DataFrame(boston_dataset.data,
                    columns=boston_dataset.feature_names)

data['MEDV'] = boston_dataset.target
data.head()

/|CRIM| ZN |INDUS |CHAS| NOX| RM| AGE| DIS| RAD| TAX| PTRATIO| B| LSTAT| MEDV
------------- | -------------
0 |0.00632| 18.0| 2.31| 0.0| 0.538| 6.575| 65.2| 4.0900| 1.0 |296.0| 15.3| 396.90| 4.98| 24.0
1 |0.02731| 0.0| 7.07| 0.0| 0.469| 6.421| 78.9| 4.9671| 2.0| 242.0| 17.8| 396.90| 9.14| 21.6
2| 0.02729| 0.0| 7.07| 0.0| 0.469| 7.185| 61.1| 4.9671| 2.0 |242.0| 17.8| 392.83| 4.03| 34.7
3| 0.03237| 0.0| 2.18| 0.0| 0.458| 6.998| 45.8| 6.0622| 3.0| 222.0| 18.7| 394.63| 2.94| 33.4
4| 0.06905| 0.0| 2.18| 0.0| 0.458| 7.147| 54.2| 6.0622| 3.0| 222.0| 18.7| 396.90 |5.33| 36.2

X_train, X_test, y_train, y_test = train_test_split(
    data.drop('MEDV', axis=1), data['MEDV'], test_size=0.3, random_state=0)
X_train.shape, X_test.shape

((354, 13), (152, 13))

進行多項式擴充,選取'LSTAT', 'RM', 'NOX'三個特徵做擴充。

poly = PolynomialFeatures(degree=3, interaction_only=False, include_bias=False)
poly.fit(X_train[['LSTAT', 'RM', 'NOX']])
train_t = poly.transform(X_train[['LSTAT', 'RM', 'NOX']])
test_t = poly.transform(X_test[['LSTAT', 'RM', 'NOX']])

查看擴充後的新特徵名稱。

poly.get_feature_names(['LSTAT', 'RM', 'NOX'])

['LSTAT',
'RM',
'NOX',
'LSTAT^2',
'LSTAT RM',
'LSTAT NOX',
'RM^2',
'RM NOX',
'NOX^2',
'LSTAT^3',
'LSTAT^2 RM',
'LSTAT^2 NOX',
'LSTAT RM^2',
'LSTAT RM NOX',
'LSTAT NOX^2',
'RM^3',
'RM^2 NOX',
'RM NOX^2',
'NOX^3']

查看擴充後個數

len(poly.get_feature_names(['LSTAT', 'RM', 'NOX']))

19

Combining features with trees使用決策樹
結合指定的特徵和決策樹,建立新的特徵。

我們使用和前面相同的3個特徵。

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV

建立決策樹學習模型:

param_grid = {'max_depth': [3,4,None]}
tree_model = GridSearchCV(DecisionTreeRegressor(random_state=0),
                          cv = 5, 
                          scoring = 'neg_mean_squared_error',
                          param_grid = param_grid) 

輸入我們選定的3個特徵。

tree_model.fit(X_train[['LSTAT', 'RM', 'NOX']], y_train)

建立新的特徵。

X_train['new_feat'] = tree_model.predict(X_train[['LSTAT', 'RM', 'NOX']])
X_test['new_feat'] = tree_model.predict(X_test[['LSTAT', 'RM', 'NOX']])

上一篇
Day23 - Feature Engineering -- 9. Mixed Variables(混和型變數)
下一篇
Day25 - Feature Engineering -- 11. Aggregating Transaction Data(合計異動資料)
系列文
Machine Learning32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言